/*
 * =====================================================================================
 *       Filename:  queue.h
 *         Author:  MIEN
 *           Date:  2015-07-09
 * =====================================================================================
 */
#ifndef QUEUE_H
#define QUEUE_H

#define QUEUE_CACHE_LENGTH (32 * 1024)

typedef struct {
    char name[32];                          /* 队列名称 */
    int tick;                               /* 循环累加数(用于生成缓冲区标签) */
    int size;                               /* 队列中的元素数目 */
    
    int write_offset;                       /* 写入缓冲区连续写入的地址偏移量 */
    char write_cache[QUEUE_CACHE_LENGTH];   /* 写入缓冲区 */
    char write_sign[20];                    /* 写入缓冲区当前的标签
                                               (队列很长时会分块写入到临时的批次文件中，
                                               每一批次都会有不同标签作为文件名，以示区分) */
    int read_offset;                        /* 读取缓冲区连续读取的地址偏移量 */
    char read_cache[QUEUE_CACHE_LENGTH];    /* 读取缓冲区 */
    char read_sign[20];                     /* 读取缓冲区下一批次目标标签
                                               (下一批次读取时根据此标签查找缓存块数据，
                                               在写入缓冲区中或者缓存文件中) */
} queue;

queue *queueCreate(const char *queue_name);
void queueFree(queue *q);

int queueIn(queue *q, const char *data);
char *queueOut(queue *q);
int queueSize(queue *q);

void queueDump(queue *q);
void queueRestore(queue *q);

#endif /* QUEUE_H */
